package com.reeves.controller;

import java.io.File;

import javax.servlet.http.HttpServletRequest;

import com.reeves.service.TestStartWithUrlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class DeployController {

    /*
    * @Autowired是使用注解的方式进行自动注入，这里就是Spring容器给DeployController实例化一个TestStartWithUrlService的对象给DeployController用，作为类的私有变量
    * 使用Spring的好处就是可以让Spring去管理所有的类的实例化工作，而不用手动的进行new一个对象
    * */
    @Autowired
    private TestStartWithUrlService testStartWithUrlService;

    /*
    * @RequestMapping是使用注解的方式来匹配url，value属性值匹配url，method属性值指定接收什么请求方法，这里是只接受GET类型的请求，produces属性值
    * 指定了返回给客户端的内容格式，text/html指的是返回一个html页面，charset=UTF-8指的是页面的字符编码是UTF-8
    * testThymeleafModel返回值是一个字符串，但是我们使用了Thymeleaf模板引擎，并且在applicationContext.xml中配置了所有的模板存放目录是在
    * webapp/WEB-INF/views目录下，return "main"，就是现实main.html页面
    * */
    @RequestMapping(value = "/main", method = RequestMethod.GET, produces = "text/html;charset=UTF-8")
    public String testThymeleafModel() {
        return "main";
    }

    /*
    * uploadZipFile方法是上传文件时访问的服务器方法，匹配路径是/uploadZipFile，然后接收POST类型请求，@RequestParam解析请求参数，存储文件到upload目录
    * 返回文件的存储路径，转到deploy.html，并且附带了一个变量fileName，在deploy.html可以访问到该变量
    * */
    @RequestMapping(value = "/uploadZipFile", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
    public ModelAndView uploadZipFile(@RequestParam(value = "deployZipFile", required = false) MultipartFile file, HttpServletRequest request) {
        String path = request.getSession().getServletContext().getRealPath("upload");
        String fileName = file.getOriginalFilename();
        System.out.println(path);
        File targetFile = new File(path, fileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }

        //Save File
        try {
            file.transferTo(targetFile);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ModelAndView modelAndView = new ModelAndView("deploy");
        // 通过addObject的方式向页面传值
        modelAndView.addObject("fileName", path);

        return modelAndView;
    }

    /*
    * 这个方法返回一个json字符串，这里的produces就设置了返回内容的格式是application/json，这里要加一个@ResponseBody注解，这样，服务器就可以
    * 自动根据你设置的返回内容格式来包装你返回的内容了
    * */
    @RequestMapping(value = "/testJson", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String testJson() {
        return "{\"name\":\"Reeves Come Back!\"}";
    }


    /*
    * 这个就是简单的转到一个页面，这个页面是用来测试静态文件配置是否成功的
    * */
    @RequestMapping(value = "/hello", method = RequestMethod.GET, produces = "text/html;charset=UTF-8")
    public String testStaticResources() {
        return "hello";
    }

    /*
    * 通过URL获取要部署的流程的ID，接着根据指定的流程ID，部署流程，并且返回流程部署结果
    * @PathVariable注解是用来处理url中的参数的，这里RequestMapping的匹配url中带了一个{processId}，就是将/deploy/***的路径中的***用processId这个
    * 变量来代表其值，是个可变的变量
    * */
    @RequestMapping(value = "/deploy/{processId}", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String testStartWithUrl(@PathVariable("processId") String processId) {
        return testStartWithUrlService.testStartWithUrl(processId);
    }
}
